package com.starblink.imgsearch.barcoderesult.ui

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.starblink.android.basic.base.BaseViewModel
import com.starblink.android.basic.network.base.SkGqlClient
import com.starblink.basic.apollo.ext.optional
import com.starblink.basic.log.SKLogger
import com.starblink.imgsearch.barcoderesult.data.RvNoProductEntry
import com.starblink.imgsearch.barcoderesult.data.RvProductEntry
import com.starblink.imgsearch.barcoderesult.data.RvTitleEntry
import com.starblink.rocketreserver.FetchProductByGtin14Query
import com.starblink.rocketreserver.RecommendProductWhenSearchByPicNoResultQuery
import com.starblink.rocketreserver.type.Gtin14Query
import com.starblink.rocketreserver.type.RecommendProductWhenSearchByPicNoResultParam
import kotlinx.coroutines.launch
import org.joda.time.DateTime

class BarcodeResultVM : BaseViewModel() {
    var barcode: String = "" // 扫描的条形码
    var isNotFoundBarcodeProdcut: Boolean = false //true表示未搜索到条形码对应商品，默认false
    var isFirstListLoadFinished = false // true表示搜索结果列表已加载完成，false表示未加载完成
    var pageNoFirstList = 0 // 搜索结果列表页数
    var pageNoRecommend = 0 // 推荐列表页数
    private val listResponse: ListResponse = ListResponse()
    var listResponseLiveData: MutableLiveData<ListResponse> =
        MutableLiveData()

    inner class ListResponse {
        val totalList =
            ArrayList<Any>() // 保存全部列表数据
        lateinit var pageList: List<Any> // 保存最近的单页请求数据
        var isFirstPage: Boolean = true //是否是首页
    }

    /**
     * 加载搜索结果，具体：
     * （1）先根据商品条形码进行搜索，如果搜索到该商品，则返回搜索结果；
     * （2）否则，获取推荐商品列表并返回
     * @param refresh: true表示请求首页，false表示请求下一页
     */
    fun loadSearchResult() {
        viewModelScope.launch {
            if (isFirstListLoadFinished) {
                // 首个列表已加载完，加载更多推荐商品列表
                loadRecommendProducts()
            } else {
                // 搜索条形码商品，或加载更多相关商品
                val requestPageNo = pageNoFirstList + 1
                val response = SkGqlClient.skQuery(
                    FetchProductByGtin14Query(
                        param = Gtin14Query(
                            gtin14 = barcode,
                            pageNo = requestPageNo,
                            pageSize = PAGE_SIZE.optional(),
                            saleableCountryFlag = true.optional(),
                        )
                    )
                )
                if (response != null) {
                    val res = response.data?.fetchProductByGtin14
                    if (requestPageNo == 1 && (res == null || (res.stdProduct == null && res.productList.isNullOrEmpty()))) {
                        // 首次加载，未找到条形码商品，显示空视图，加载推荐商品列表
                        listResponse.totalList.add(RvNoProductEntry())
                        loadRecommendProducts()
                    } else if (requestPageNo == 1 && res != null) {
                        SKLogger.e("dss", "FetchProductByGtin14Query成功=${res}")
                        // 首次加载，搜索到条形码商品
                        if (res.stdProduct != null) {
                            // 有标品数据，显示之
                            listResponse.totalList.add(res.stdProduct!!)
                        }
                        if (res.productList.isNullOrEmpty()) {
                            // 相关商品数据时为空，加载推荐商品列表
                            loadRecommendProducts()
                        } else {
                            // 有相关商品数据，显示标题、数据
                            listResponse.totalList.add(RvTitleEntry("Find the products for you"))
                            showFetchProductByGtin14Result(requestPageNo, res)
                        }
                    } else {
                        // 加载更多相关商品
                        SKLogger.e("dss", "FetchProductByGtin14Query成功=${res}")
                        if (res == null || res.productList.isNullOrEmpty()) {
                            // 相关商品数据时为空，加载推荐商品列表
                            loadRecommendProducts()
                        } else {
                            // 有相关商品数据，显示之
                            showFetchProductByGtin14Result(requestPageNo, res)
                        }
                    }
                } else {
                    // 接口请求失败
                    loadError(null)
                }
            }
        }
    }

    private fun showFetchProductByGtin14Result(
        requestPageNo: Int,
        res: FetchProductByGtin14Query.FetchProductByGtin14,
    ) {
        pageNoFirstList = requestPageNo
        listResponse.apply {
            pageList = res.productList!!.map {
                RvProductEntry(
                    product = it.productF,
                    isStandardProduct = true
                )
            }
            isFirstPage = requestPageNo == 1
            totalList.addAll(pageList)
        }
        listResponseLiveData.postValue(listResponse)
    }

    /**加载推荐商品列表*/
    private suspend fun loadRecommendProducts() {
        isFirstListLoadFinished = true

        val requestPageNo = pageNoRecommend + 1
        val res = SkGqlClient.skQuery(
            RecommendProductWhenSearchByPicNoResultQuery(
                params = RecommendProductWhenSearchByPicNoResultParam(
                    pageNo = requestPageNo,
                    pageSize = PAGE_SIZE,
                    clientTime = DateTime.now().millis.toString().optional()
                )
            )
        )?.data?.recommendProductWhenSearchByPicNoResult
        if (res != null) {
            SKLogger.e("dss", "loadRecommendProducts成功=${res}")
            pageNoRecommend = requestPageNo
            val tmpPageList = ArrayList<Any>()
            if (res.isNotEmpty()) {
                if (requestPageNo == 1) {
                    // 加载首页推荐列表时，添加标题
                    tmpPageList.add(RvTitleEntry("Related products"))
                }
                tmpPageList.addAll(res.map {
                    RvProductEntry(
                        product = it.productF,
                        isStandardProduct = false
                    )
                })
            }
            listResponse.apply {
                isFirstPage = pageNoFirstList + pageNoRecommend == 1
                pageList = tmpPageList
                totalList.addAll(pageList)
            }
            listResponseLiveData.postValue(listResponse)
        } else {
            // 加载失败，结束加载更多
            loadError(null)
        }
    }

    companion object {
        const val PAGE_SIZE = 20
    }
}